package com.wxxymaker.model;

import org.springframework.util.ObjectUtils;

import java.lang.reflect.Field;
import java.util.Collection;

/**
 * @Author: Soft
 * @Date: 2018/5/8 22:55
 * @Desc: 实体类接口，提供一些通用的方法接口
 */
public interface Model {
    /**
     * 仿照javascript中将target中的内容覆盖到自身
     * @param target 包涵要覆盖内容的实体对象
     */
    default Model extend(Model target) {
        Field[] targetFields = target.getClass().getDeclaredFields();
        Field[] sourceFields = this.getClass().getDeclaredFields();

        if (target.getClass() == this.getClass()) {
            for (int i = 0; i < targetFields.length; i++) {
                Field sourceField = sourceFields[i];
                Field targetField = targetFields[i];
                sourceField.setAccessible(true);
                targetField.setAccessible(true);

                try {
                    Object o = targetField.get(target);
                    // 去除集合属性，集合不属于被修改的范围
                    if (!(o instanceof Collection) && !ObjectUtils.isEmpty(o)) {
                        // 避免0将原值覆盖，平台下数据不会出现需要修改成0值的数据，所以这样可以 5.30
                        if (o instanceof Number && Double.parseDouble(o.toString()) <= 0.0) {
                            continue;
                        }
                        sourceField.set(this, o);
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        } else {
            throw new ClassCastException("两个类，类型不相同，不能进行值覆盖！");
        }
        return this;
    }
}
